home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / glibc108.zip / glibc108 / sysdeps / unix / nlist.c < prev    next >
C/C++ Source or Header  |  1991-06-12  |  2KB  |  92 lines

  1. /* Copyright (C) 1991 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2, or (at your option)
  7. any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU General Public License for more details.
  13.  
  14. You should have received a copy of the GNU General Public License
  15. along with the GNU C Library; see the file COPYING.  If not, write to
  16. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17.  
  18. #include <ansidecl.h>
  19. #include <errno.h>
  20. #include <a.out.h>
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24.  
  25.  
  26. /* Search the executable FILE for symbols matching those in NL,
  27.    which is terminated by an element with a NULL `n_un.n_name' member,
  28.    and fill in the elements of NL.  */
  29. int
  30. DEFUN(nlist, (file, nl),
  31.       CONST char *file AND struct nlist *nl)
  32. {
  33.   FILE *f;
  34.   struct exec header;
  35.   size_t nsymbols;
  36.   struct nlist *symbols;
  37.   unsigned long int string_table_size;
  38.   char *string_table;
  39.   register size_t i;
  40.  
  41.   if (nl == NULL)
  42.     {
  43.       errno = EINVAL;
  44.       return -1;
  45.     }
  46.  
  47.   f = fopen(file, "r");
  48.   if (f == NULL)
  49.     return -1;
  50.  
  51.   if (fread((PTR) &header, sizeof(header), 1, f) != 1)
  52.     goto lose;
  53.  
  54.   if (fseek(f, N_SYMOFF(header), SEEK_SET) != 0)
  55.     goto lose;
  56.  
  57.   symbols = (struct nlist *) __alloca(header.a_syms);
  58.   nsymbols = header.a_syms / sizeof(symbols[0]);
  59.  
  60.   if (fread((PTR) symbols, sizeof(symbols[0]), nsymbols, f) != nsymbols)
  61.     goto lose;
  62.  
  63.   if (fread((PTR) &string_table_size, sizeof(string_table_size), 1, f) != 1)
  64.     goto lose;
  65.   string_table_size -= sizeof(string_table_size);
  66.  
  67.   string_table = (char *) __alloca(string_table_size);
  68.   if (fread((PTR) string_table, string_table_size, 1, f) != 1)
  69.     goto lose;
  70.  
  71.   for (i = 0; i < nsymbols; ++i)
  72.     {
  73.       register struct nlist *nlp;
  74.       for (nlp = nl; nlp->n_un.n_name != NULL; ++nlp)
  75.     if (!strcmp(nlp->n_un.n_name,
  76.             &string_table[symbols[i].n_un.n_strx -
  77.                   sizeof(string_table_size)]))
  78.       {
  79.         char *CONST name = nlp->n_un.n_name;
  80.         *nlp = symbols[i];
  81.         nlp->n_un.n_name = name;
  82.       }
  83.     }
  84.  
  85.   (void) fclose(f);
  86.   return 0;
  87.  
  88.  lose:;
  89.   (void) fclose(f);
  90.   return -1;
  91. }
  92.